//package sf.jooq.tables;
//
//import org.jooq.DataType;
//import org.jooq.Field;
//import org.jooq.Index;
//import org.jooq.Name;
//import org.jooq.OrderField;
//import org.jooq.Record;
//import org.jooq.Schema;
//import org.jooq.Table;
//import org.jooq.TableField;
//import org.jooq.UniqueKey;
//import org.jooq.impl.DSL;
//import org.jooq.impl.Internal;
//import org.jooq.impl.JooqVisitor2;
//import org.jooq.impl.TableImpl;
//import sf.jooq.Jooq;
//import sf.spring.util.Assert;
//import sf.spring.util.LinkedCaseInsensitiveMap;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//
///**
// * 动态表支持
// * @param <R>
// */
//public class DynamicJooqTable<R extends Record> extends TableImpl<R> {
//    /**
//     *
//     */
//    private static final long serialVersionUID = 1L;
//
//    protected final Map<String, TableField<R, ?>> map = new LinkedCaseInsensitiveMap<>();
//    protected final Map<String, JooqField> fields = new LinkedCaseInsensitiveMap<>();
//
//    private Schema schema;
//    private Name name;
//    private String comment = "";
//    UniqueKey<R> primaryKey = null;
//    Index primaryIndex = null;
//    List<UniqueKey<R>> uniqueKeys = new ArrayList<>();
//    List<Index> indexs = new ArrayList<>();
//
//    static DynamicJooqTable<?> DEFAULT = new DynamicJooqTable<>((Name) null);
//
//    @Override
//    public Class<? extends R> getRecordType() {
//        return super.getRecordType();
//    }
//
//    protected DynamicJooqTable(Name name) {
//        super(name);
//    }
//
//    public DynamicJooqTable(String name) {
//        super(DSL.name(name));
//    }
//
//    protected DynamicJooqTable(Name name, Schema schema) {
//        super(name, schema);
//    }
//
//    protected DynamicJooqTable(Name name, Schema schema, Table<?> aliased) {
//        super(name, schema, (Table<R>) aliased);
//    }
//
//    protected DynamicJooqTable(Name name, Schema schema, Table<R> aliased, Field<?>[] parameters) {
//        super(name, schema, aliased, parameters);
//    }
//
//    protected DynamicJooqTable(Name name, Schema schema, Table<R> aliased, Field<?>[] parameters, String comment) {
//        super(name, schema, aliased, parameters, comment);
//    }
//
//
//    /**
//     * @param name    表名
//     * @param catalog
//     * @param schema
//     * @param comment
//     */
//    public DynamicJooqTable(String name, String catalog, String schema, String comment) {
//        this(name, catalog, schema, null, comment);
//    }
//
//    /**
//     * @param name    表名
//     * @param catalog
//     * @param schema
//     * @param aliased 别名
//     * @param comment
//     */
//    public DynamicJooqTable(String name, String catalog, String schema, Table aliased, String comment) {
//        super(DSL.name(name), Jooq.getSchema(catalog, schema), (Table<R>) aliased, null, comment);
//        this.schema = Jooq.getSchema(catalog, schema);
//        this.name = DSL.name(name);
//    }
//
//
//    /**
//     * 添加列
//     * @param columnName
//     * @param type
//     * @param comment
//     * @param <R>
//     * @param <T>
//     * @return
//     */
//    public <R extends Record, T> TableField<Record, T> addColumn(String columnName, DataType<T> type, String comment) {
//        TableField<Record, T> tf = createField(columnName, type, (Table<Record>) this, comment);
//        JooqField jf = new JooqField();
//        jf.setName(columnName);
//        jf.setType(type);
//        jf.setTable(this);
//        jf.setComment(comment);
//        jf.setConverter(null);
//        jf.setBinding(null);
//        fields.put(jf.getName(), jf);
//        return tf;
//    }
//
//    /**
//     * 删除列
//     * @param columnNames
//     */
//    public void removeColumn(String... columnNames) {
//        if (columnNames != null) {
//            JooqVisitor2.removeFields(this, columnNames);
//            for (int i = 0; i < columnNames.length; i++) {
//                String c = columnNames[i];
//                fields.remove(c);
//            }
//        }
//    }
//
//
//    public <R extends Record, T> TableField<R, T> column(String field) {
//        TableField<? extends Record, ?> expression = map.get(field);
//        if (expression == null) {
//            throw new RuntimeException("字段不存在");
//        }
//        return (TableField<R, T>) expression;
//    }
//
//    public <R extends Record, T> TableField<R, T> c(String field) {
//        return column(field);
//    }
//
//    public List<TableField<? extends Record, ?>> getTableFields() {
//        List<TableField<? extends Record, ?>> list = new ArrayList<>();
//        for (Map.Entry<String, TableField<R, ?>> entry : map.entrySet()) {
//            list.add(entry.getValue());
//        }
//        return list;
//    }
//
//    /**
//     * {@inheritDoc}
//     */
//    @Override
//    public DynamicJooqTable<R> as(String alias) {
//        DynamicJooqTable table = new DynamicJooqTable<R>(DSL.name(alias), schema, this, null, comment);
//        table.fields.putAll(this.fields);
//        table.addDBColumn();
//        return table;
//    }
//
//    /**
//     * {@inheritDoc}
//     */
//    @Override
//    public DynamicJooqTable<R> as(Name alias) {
//        DynamicJooqTable table = new DynamicJooqTable<R>(alias, schema, this, null, comment);
//        table.fields.putAll(this.fields);
//        table.addDBColumn();
//        return table;
//    }
//
//    /**
//     * Rename this table
//     */
//    @Override
//    public DynamicJooqTable<R> rename(String name) {
//        DynamicJooqTable table = new DynamicJooqTable<R>(DSL.name(name), schema, null, null, comment);
//        table.fields.putAll(this.fields);
//        table.addDBColumn();
//        return table;
//    }
//
//    /**
//     * Rename this table
//     */
//    @Override
//    public DynamicJooqTable<R> rename(Name name) {
//        DynamicJooqTable table = new DynamicJooqTable<R>(name, schema, null, null, comment);
//        table.fields.putAll(this.fields);
//        table.addDBColumn();
//        return table;
//    }
//
//    @Override
//    public UniqueKey<R> getPrimaryKey() {
//        return primaryKey;
//    }
//
//    @Override
//    public List<UniqueKey<R>> getKeys() {
//        return uniqueKeys;
//    }
//
//    public void setKey(UniqueKey<R> key) {
//        if (key == null) {
//            throw new NullPointerException("uniqueKey is null");
//        }
//        this.uniqueKeys.add(key);
//    }
//
//    /**
//     * 添加主键
//     * @param columns
//     * @return
//     */
//    public UniqueKey<R> addPrimaryKey(String... columns) {
//        Assert.notEmpty(columns, "");
//        UniqueKey uniqueKey = null;
//        int i = 0;
//        TableField<R, ?>[] pkTableFields = new TableField[columns.length];
//        for (TableField tf : getTableFields()) {
//            for (String column : columns) {
//                if (Objects.equals(column, tf.getName())) {
//                    pkTableFields[i++] = tf;
//                    break;
//                }
//            }
//        }
//        if (pkTableFields.length > 0) {
//            uniqueKey = Internal.createUniqueKey(this, pkTableFields);
//            uniqueKeys.add(uniqueKey);
//            //添加主键索引
//            addIndex("PRIMARY", columns);
//        }
//        return uniqueKey;
//    }
//
//    /**
//     * 添加索引
//     * @param indexName
//     * @param columns
//     * @return
//     */
//    public Index addIndex(String indexName, String... columns) {
//        Assert.notEmpty(columns, "");
//        Index index = null;
//        int i = 0;
//        TableField<R, ?>[] tableFields = new TableField[columns.length];
//        for (TableField tf : getTableFields()) {
//            for (String column : columns) {
//                if (Objects.equals(column, tf.getName())) {
//                    tableFields[i++] = tf;
//                    break;
//                }
//            }
//        }
//        if (tableFields.length > 0) {
//            OrderField<?>[] of = new OrderField[tableFields.length];
//            System.arraycopy(tableFields, 0, of, 0, tableFields.length);
//            //PRIMARY
//            index = Internal.createIndex(indexName, this, of, true);
//            indexs.add(index);
//        }
//        return index;
//    }
//
//    @Override
//    public List<Index> getIndexes() {
//        return indexs;
//    }
//
//    public void setIndex(Index index) {
//        if (index == null) {
//            throw new NullPointerException("index is null");
//        }
//        this.indexs.add(index);
//    }
//
//
//    @Override
//    public Schema getSchema() {
//        return schema;
//    }
//
//
//    public Map<String, TableField<R, ?>> getMap() {
//        return map;
//    }
//
//    protected void addDBColumn() {
//        for (Map.Entry<String, JooqField> entry : fields.entrySet()) {
//            JooqField jf = entry.getValue();
//            TableField tf = createField(DSL.name(jf.getName()), jf.getType(), this, jf.getComment(), jf.getConverter(), jf.getBinding());
//            map.put(jf.getName(), tf);
//        }
//    }
//
//}
